#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <fstream>
#include <sstream>
using std::cout;
using std::istringstream;
using std::map;
using std::set;
using std::ifstream;
using std::vector;
using std::string;
using std::endl;



class TextQuery{
public:
    //思路：
    //1.先构建一个文件输入流对象，绑定需要处理的文件
    //2.每次读取一行(这一行数据需要存储在_lines中)，进一步解析每个单词
    //3.针对每一个单词，需要记录当前单词以及出现的次数
    //4.针对每一个单词，还需要将这个单词出现的行号全部记录下来，存储到一个set中
    void readFile(const string & filename){
        ifstream ifs(filename);
        if(!ifs.good()){
            cout << "the file is not found" << endl;
            return;
        }
        string line;
        int lineNumber = 0;
        while(getline(ifs, line)){
            ++lineNumber;
            //这个地方其实可以调用reserve预先先开辟空间，可以减少扩容次数
            _lines.push_back(line);
            istringstream iss(line);
            string word;
            while(iss >> word){
                //行号最小是从1开始的
                _wordLineNumbers[word].insert(lineNumber); 
                ++_wordCount[word];
            }
        }
    }


    void query(const string & word){
        cout << "====================================" << endl;
        cout << word << " occurs " << _wordCount[word] << " times" << endl;
        for(auto & lineNumber:_wordLineNumbers[word]){
            cout << "(line " << lineNumber << ")" << _lines[lineNumber - 1] << endl;
        }
        cout << "====================================" << endl;
    }

private:
    //存储的是每一行的原始信息
    vector<string> _lines;

    //每个单词出现的行号信息
    map<string,set<int>> _wordLineNumbers;
    //每个单词出现的总次数
    map<string,int> _wordCount;

};


void test(){
    TextQuery tq;
    tq.readFile("china_daily.txt");
    tq.query("Shenzhen");
}

int main()
{
    test();
    return 0;
}

